import java.util.Scanner
import kotlin.system.exitProcess

class Contacts private constructor(){
    companion object {
        /**
         * by lazy 懒加载
         * 定义时不加载，使用时才加载
         * 只会被加载一次
         */
        val instance: Contacts by lazy {
            Contacts()
        }
    }

    //容器保存所有联系人
    private val friendsMap: MutableMap<Char,ArrayList<Person>> = mutableMapOf()
    //保存每个小组的组名
    private val titles: ArrayList<Char> = arrayListOf()

    //添加好友
    fun add(name:String){
        //创建person对象 同时完成中文转拼音操作
        /*
        val person = Person().apply {
            this.name = name
        }
        addFriend(person)
         */
        addFriend(Person().apply { this.name = name })
    }

    private fun addFriend(person: Person) {
        //判断有没有自己的小组
        if (titles.contains(person.title)){
            //找到这个title对应的小组好友 添加好友
            friendsMap[person.title].also {
                //添加好友
                it!!.add(person)
                //排序
                //pengxiao
                //pangge
                it.sortWith(person)
            }
        }else{
            //新建一个键值对
            //key就是person的titile
            //value就是一个数组 这个数组中只有当前这一个person
            friendsMap.put(
                person.title,
                arrayListOf(person)
            )

            //保存新建的小组的组名
            titles.add(person.title)
            //排序
            titles.sort()
        }
    }

    //删除好友
    fun delete(name: String){
        val person = Person().apply { this.name = name }
        //判断有没有这一组
        if (titles.contains(person.title)){
            //判断小组好友中有没有这个人
            val friendList = friendsMap[person.title]
            for (p in friendList!!){
                if (p.name == person.name){
                    friendList.remove(p)
                    if (friendList.isEmpty()){
                        friendsMap.remove(person.title)
                        titles.remove(person.title)
                    }
                    break
                }
            }
        }
    }

    //显示好友列表
    fun show(){
        titles.forEach { key ->
            //获取标题对应的组员 it就是key 获得对应的value
            /*
            val list = friendsMap[key]
            list!!.forEach { person ->
                println(person)
            }
            */
            println(key)
            friendsMap[key]?.forEach { person ->
                println(person)
            }
        }
    }
}

fun main() {
    Contacts.instance.add("彭孝东")
    Contacts.instance.add("旁小动")
    Contacts.instance.add("彭德怀")
    Contacts.instance.add("毛泽东")
    Contacts.instance.add("毛爱英")
    Contacts.instance.add("李娜")

    val scanner = Scanner(System.`in`)
    while (true){
        OperationInterface.instance.showMenu()
        OperationInterface.instance.choose{
            when(it){
                OperationType.ADD ->{
                    print("请输入好友姓名:")
                    Contacts.instance.add(scanner.nextLine())
                }
                OperationType.REMOVE ->{
                    print("请输入好友姓名:")
                    Contacts.instance.delete(scanner.nextLine())
                }
                OperationType.SHOW ->{
                    Contacts.instance.show()
                }
                OperationType.EXIT ->{
                    exitProcess(1)
                }
            }
        }

    }
}